package com.hzvictory.hotel_system.service.Impl;

import com.hzvictory.hotel_system.common.constant.MessageConstant;
import com.hzvictory.hotel_system.common.constant.StatusConstant;
import com.hzvictory.hotel_system.common.exception.AccountLockedException;
import com.hzvictory.hotel_system.common.exception.AccountNotFoundException;
import com.hzvictory.hotel_system.common.exception.PasswordErrorException;
import com.hzvictory.hotel_system.mapper.UserMapper;
import com.hzvictory.hotel_system.pojo.dto.ChangePasswordDTO;
import com.hzvictory.hotel_system.pojo.dto.UserLoginDTO;
import com.hzvictory.hotel_system.pojo.entity.User;
import com.hzvictory.hotel_system.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.List;

/**
 * 功能
 * 作者：何征
 * 日期：2025/7/14 22:29
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    public User login(UserLoginDTO userLoginDTO) {
        String username = userLoginDTO.getUsername();
        String password = userLoginDTO.getPassword();

        //1、根据用户名查询数据库中的数据
        User user = userMapper.getByUsername(username);
        //2、处理各种异常情况（用户名不存在、密码不对、账号被锁定）
        if (user == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        if (!password.equals(user.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        if (user.getStatus().equals(StatusConstant.DISABLE) ) {
            //账号被锁定
            throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
        }

        //3、返回实体对象
        return user;
    }

    /**
     * 查询用户表
     *
     * @param id 用户表主键
     * @return 用户表
     */
    @Override
    public User selectUserById(Long id)
    {
        return userMapper.selectUserById(id);
    }

    /**
     * 查询用户表列表
     *
     * @param user 用户表
     * @return 用户表
     */
    @Override
    public List<User> selectUserList(User user)
    {
        return userMapper.selectUserList(user);
    }

    /**
     * 新增用户表
     *
     * @param user 用户表
     * @return 结果
     */
    @Override
    public int insertUser(User user)
    {
        String password= user.getPassword();
        user.setPassword(DigestUtils.md5DigestAsHex(password.getBytes()));
        return userMapper.insertUser(user);
    }

    /**
     * 修改用户表
     *
     * @param user 用户表
     * @return 结果
     */
    @Override
    public int updateUser(User user)
    {
        String password= user.getPassword();
        user.setPassword(DigestUtils.md5DigestAsHex(password.getBytes()));
        return userMapper.updateUser(user);
    }
    /**
     * 修改密码
     *
     * @param changePasswordDTO 密码输入
     * @return 结果
     */
    @Override
    public int ChangePassword(ChangePasswordDTO changePasswordDTO) {
        Long id = changePasswordDTO.getId();
        String oldPassword = changePasswordDTO.getOldPassword();
        String newPassword = changePasswordDTO.getPassword();

        // 1. 根据用户名查询用户
        User user = userMapper.selectUserById(id);
        if (user == null) {
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        // 2. 检查用户状态是否正常
        if (StatusConstant.DISABLE.equals(user.getStatus())) {
            throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
        }

        // 3. 验证旧密码（MD5加密后比较）
        String encryptedOldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes());
        if (!encryptedOldPassword.equals(user.getPassword())) {
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        // 4. 检查新密码是否与旧密码相同
        String encryptedNewPassword = DigestUtils.md5DigestAsHex(newPassword.getBytes());
        if (encryptedNewPassword.equals(user.getPassword())) {
            log.warn("新密码不能与旧密码相同，用户: {}", id);
            return 0; // 返回0表示更新失败
        }

        // 5. 创建更新对象并执行更新
        User updateUser = new User();
        updateUser.setId(user.getId());
        updateUser.setPassword(encryptedNewPassword);

        return userMapper.updateUser(updateUser);
    }


    /**
     * 批量删除用户表
     *
     * @param ids 需要删除的用户表主键
     * @return 结果
     */
    @Override
    public int deleteUserByIds(Long[] ids)
    {
        return userMapper.deleteUserByIds(ids);
    }

    /**
     * 删除用户表信息
     *
     * @param id 用户表主键
     * @return 结果
     */
    @Override
    public int deleteUserById(Long id)
    {
        return userMapper.deleteUserById(id);
    }
}
